package com.share.syn;

public class Demo1_Synchronized {

	/**
	 * @param args
	 * 同步代码块:希望在一个线程输出的过程中，cpu不要打断（不要切换到另外一个线程）
	 */
	public static void main(String[] args) {
		final Printer p = new Printer();//匿名内部类调用局部变量的时候，局部变量要用final修饰
		
		new Thread() {
			public void run() {
//				while(true) {
				for(int i = 0; i < 1000; i++ ){
					p.print1();
				}
			}
		}.start();
		
		new Thread() {
			public void run() {
//				while(true) {
				for(int i = 0; i < 1000; i++ ){
					p.print2();
				}
			}
		}.start();
	}

}


//同步代码块与事务的区别：同步代码块中随时可停止，不会回滚。事务会回滚
class Printer {
	Demo d = new Demo();
	public void print1() {
	synchronized(new Demo()) {							//同步代码块,锁机制-----锁对象可以是任意的
		//synchronized(d) {//代码快中的代码别人是进不来的，会一直占用着cpu，全部执行完，才会有可能释放cpu------同步代码块相当于占用cpu的最小单元。没有同步代码块，每行代码是占用cpu的最小单元。
			System.out.print("1");
			System.out.print("2");
			System.out.print("3");
			System.out.print("4");
			System.out.print("5");
			System.out.print("\r\n");
//			try {
//				Thread.sleep(3000);//不释放锁
//			} catch (InterruptedException e) {
//				// TODO Auto-generated catch block
//				e.printStackTrace();
//			}
		}
	}
	
	public void print2() {
		synchronized(new Demo()) {							//锁对象不能用匿名对象,因为匿名对象不是同一个对象
		//synchronized(d) {		
			System.out.print("a");
			System.out.print("b");
			System.out.print("c");
			System.out.print("d");
			System.out.print("\r\n");
//			try {
//				Thread.sleep(3000);
//			} catch (InterruptedException e) {
//				// TODO Auto-generated catch block
//				e.printStackTrace();
//			}
		}
	}
}

class Demo{}